home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 17
/
CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso
/
CUCD
/
Programming
/
DiceSource
/
src
/
dmake
/
var.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-09-09
|
3KB
|
134 lines
/*
* (c)Copyright 1992-1997 Obvious Implementations Corp. Redistribution and
* use is allowed under the terms of the DICE-LICENSE FILE,
* DICE-LICENSE.TXT.
*/
/*
* VAR.C
*/
#include "defs.h"
#ifdef AMIGA
#include <dos/dos.h>
#endif
Prototype void InitVar(void);
Prototype Var *MakeVar(char *, char);
Prototype Var *FindVar(char *, char);
Prototype void AppendVar(Var *, char *, long);
List VarList;
void
InitVar(void)
{
NewList(&VarList);
}
/*
* create a variable, deleting any previous contents
*/
Var *
MakeVar(char *name, char type)
{
Var *var;
for (var = GetHead(&VarList); var; var = GetSucc(&var->var_Node)) {
if ((char)var->var_Node.ln_Type == type && strcmp(var->var_Node.ln_Name, name) == 0) {
while (PopCmdListChar(&var->var_CmdList) != EOF)
;
return(var);
}
}
var = malloc(sizeof(Var) + strlen(name) + 1);
clrmem(var, sizeof(Var));
var->var_Node.ln_Name = (char *)(var + 1);
var->var_Node.ln_Type = type;
strcpy(var->var_Node.ln_Name, name);
NewList(&var->var_CmdList);
AddTail(&VarList, &var->var_Node);
return(var);
}
Var *
FindVar(char *name, char type)
{
Var *var;
for (var = GetHead(&VarList); var; var = GetSucc(&var->var_Node)) {
if ((char)var->var_Node.ln_Type == type && strcmp(var->var_Node.ln_Name, name) == 0)
break;
}
/*
* check for local & env variable(s). local variables under 2.04
* or later only.
*/
if (var == NULL || var->var_Node.ln_Type == '0') {
#ifdef AMIGA
if (Running2_04()) {
char *ptr;
long len;
if (GetVar(name, (char *)&ptr, 2, 0) >= 0) {
len = IoErr();
ptr = malloc(len + 1);
if (GetVar(name, ptr, len + 1, 0) >= 0) {
var = MakeVar(name, '0');
AppendVar(var, ptr, strlen(ptr));
}
free(ptr);
}
} else {
BPTR lock;
long fh;
long size;
if (lock = Lock("ENV:", SHARED_LOCK)) {
if (fh = Open(name, 1005)) {
Seek(fh, 0L, 1);
if ((size = Seek(fh, 0L, -1)) >= 0) {
char *ptr = malloc(size + 1);
Read(fh, ptr, size);
ptr[size] = 0;
var = MakeVar(name, '0');
AppendVar(var, ptr, strlen(ptr));
free(ptr);
}
Close(fh);
}
UnLock(lock);
}
}
#else
{
char *ptr;
if ((ptr = getenv(name)) != NULL) {
var = MakeVar(name, '0');
AppendVar(var, ptr, strlen(ptr));
}
}
#endif
}
return(var);
}
void
AppendVar(var, buf, len)
Var *var;
char *buf;
long len;
{
while (len--)
PutCmdListChar(&var->var_CmdList, *buf++);
}